<?php

namespace App\Cache\User;

use App\Services\User\UserService;
use Illuminate\Support\Facades\Cache;
use Psr\SimpleCache\InvalidArgumentException;

/**
 * 用户管理缓存
 */
class UserCache
{
    // 缓存标签
    public static $tag = 'user';
    // 缓存前缀
    protected static $prefix = 'user:';
    // token标签
    protected static $tag_token = 'user_token';
    // token前缀
    protected static $prefix_token = 'user_token:';

    /**
     * 缓存键名
     *
     * @param mixed $id 用户id、key
     *
     * @return string
     */
    private static function key(mixed $id): string
    {
        return self::$prefix . $id;
    }

    /**
     * 缓存设置
     *
     * @param mixed $id 用户id、key
     * @param $info
     * @param int $ttl 有效时间（秒，0永久）
     *
     * @return bool
     */
    public static function set($id,  $info, int $ttl = 604800): bool
    {
        return Cache::tags(self::$tag)->put(self::key($id), $info, $ttl);
    }

    /**
     * Notes:该数据在缓存里是否存在
     * DateTime: 2023/8/18 17:15
     * Author: tzhe
     * @param $id
     * @return bool
     */
    public function has($id): bool
    {
        return Cache::has(self::key($id));
    }

    /**
     * 缓存获取
     *
     * @param mixed $id 用户id、key
     *
     */
    public static function get($id)
    {
        return Cache::tags(self::$tag)->get(self::key($id));
    }

    /**
     * 删除缓存
     *
     * @param mixed $id 用户id、key
     *
     * @return bool
     */
    public static function forget($id = ''): bool
    {
        $ids = var_to_array($id);
        foreach ($ids as $v) {
            Cache::tags(self::$tag)->forget(self::key($v));
        }
        return true;
    }

    /**
     * 缓存更新
     *
     * @param mixed $id 用户id
     *
     * @return void
     * @throws InvalidArgumentException
     */
    public static function update($id)
    {
        $ids = var_to_array($id);
        foreach ($ids as $v) {
            $old = self::get($v);
            if ($old) {
                self::forget($v);
                /** @var UserService $userService */
                $userService = app('App\\Services\\User\\UserService');
                $new = $userService->getInstance($v);
                if ($new) {
                    self::set($v, $new);
                }
            }
        }
    }

    /**
     * token键名
     *
     * @param mixed $id 用户id
     *
     * @return string
     */
    public static function keyToken($id): string
    {
        return self::$prefix_token . $id;
    }

    /**
     * Token设置
     *
     * @param int $id 用户id
     * @param array $info 用户token
     * @param int $ttl 有效时间（秒，0永久）
     *
     * @return bool
     * @throws InvalidArgumentException
     */
    public static function setToken(int $id, array $info, int $ttl = 604800): bool
    {
        return Cache::tags(self::$tag_token)->set(self::keyToken($id), $info, $ttl);
    }

    /**
     * Token获取
     *
     * @param int $id 用户id
     *
     * @return array 用户token
     */
    public static function getToken(int $id): array
    {
        return Cache::get(self::keyToken($id));
    }

    /**
     * token删除
     *
     * @param mixed $id 用户id
     *
     * @return bool
     */
    public static function delToken($id): bool
    {
        $ids = var_to_array($id);
        foreach ($ids as $v) {
            Cache::forget(self::keyToken($v));
        }
        return true;
    }

    public static function clear(): bool
    {
        return Cache::tags(self::$tag)->flush();
    }

}
